package com.kexio.file.service;

import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.kexio.file.entity.FileStorageConfig;

/**
 * 文件存储配置服务接口
 * 
 * @author Kexio Team
 * @since 1.0.0
 */
public interface FileStorageConfigService extends IService<FileStorageConfig> {

    /**
     * 分页查询存储配置
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param configName 配置名称（可选）
     * @param configType 存储类型（可选）
     * @param enabled 启用状态（可选）
     * @return 分页结果
     */
    IPage<FileStorageConfig> pageConfigs(Long current, Long size, String configName, String configType, Boolean enabled);

    /**
     * 获取所有启用的配置列表
     * 
     * @return 启用的配置列表
     */
    List<FileStorageConfig> listEnabledConfigs();

    /**
     * 根据存储类型获取配置列表
     * 
     * @param configType 存储类型
     * @return 配置列表
     */
    List<FileStorageConfig> listConfigsByType(String configType);

    /**
     * 获取默认存储配置
     * 
     * @return 默认配置，如果没有则返回null
     */
    FileStorageConfig getDefaultConfig();

    /**
     * 创建存储配置
     * 
     * @param config 配置信息
     * @return 创建成功的配置
     */
    FileStorageConfig createConfig(FileStorageConfig config);

    /**
     * 更新存储配置
     * 
     * @param config 配置信息
     * @return 更新后的配置
     */
    FileStorageConfig updateConfig(FileStorageConfig config);

    /**
     * 删除存储配置（软删除）
     * 
     * @param configId 配置ID
     * @return 是否删除成功
     */
    boolean deleteConfig(String configId);

    /**
     * 批量删除存储配置
     * 
     * @param configIds 配置ID列表
     * @return 删除成功的数量
     */
    int batchDeleteConfigs(List<String> configIds);

    /**
     * 设置默认配置
     * 
     * @param configId 配置ID
     * @return 是否设置成功
     */
    boolean setDefaultConfig(String configId);

    /**
     * 启用/禁用配置
     * 
     * @param configId 配置ID
     * @param enabled 启用状态
     * @return 是否操作成功
     */
    boolean toggleConfigStatus(String configId, boolean enabled);

    /**
     * 批量更新排序
     * 
     * @param configs 包含ID和排序字段的配置列表
     * @return 是否更新成功
     */
    boolean updateSortOrder(List<FileStorageConfig> configs);

    /**
     * 测试配置连接
     * 
     * @param config 配置信息
     * @return 测试结果
     */
    Map<String, Object> testConnection(FileStorageConfig config);

    /**
     * 验证配置参数
     * 
     * @param configType 存储类型
     * @param configParams 配置参数JSON
     * @return 验证结果
     */
    Map<String, Object> validateConfig(String configType, String configParams);

    /**
     * 获取配置使用统计
     * 
     * @return 使用统计信息
     */
    List<Map<String, Object>> getUsageStats();

    /**
     * 复制配置
     * 
     * @param sourceConfigId 源配置ID
     * @param newConfigName 新配置名称
     * @return 复制后的配置
     */
    FileStorageConfig copyConfig(String sourceConfigId, String newConfigName);

    /**
     * 导出配置
     * 
     * @param configIds 配置ID列表
     * @return 配置导出数据
     */
    List<Map<String, Object>> exportConfigs(List<String> configIds);

    /**
     * 导入配置
     * 
     * @param configData 配置数据列表
     * @return 导入结果统计
     */
    Map<String, Object> importConfigs(List<Map<String, Object>> configData);

    /**
     * 检查配置名称是否唯一
     * 
     * @param configName 配置名称
     * @param excludeId 排除的配置ID（编辑时使用）
     * @return 是否唯一
     */
    boolean isConfigNameUnique(String configName, String excludeId);

    /**
     * 获取存储类型选项
     * 
     * @return 存储类型选项列表
     */
    List<Map<String, Object>> getStorageTypeOptions();

    /**
     * 根据配置类型获取参数模板
     * 
     * @param configType 存储类型
     * @return 参数模板
     */
    Map<String, Object> getConfigTemplate(String configType);
}
